package es.ucm.fdi.isbc.viviendas.representacion.similitud;

import es.ucm.fdi.isbc.viviendas.representacion.Coordenada;
import jcolibri.exception.NoApplicableSimilarityFunctionException;
import jcolibri.method.retrieve.NNretrieval.similarity.LocalSimilarityFunction;

public class SimilitudCoordenadas implements LocalSimilarityFunction{

	public double compute(Object caseObject, Object queryObject)
			throws NoApplicableSimilarityFunctionException {
		
		if(caseObject==null || queryObject==null){
			return 0.0;
		}
		
		double valor=0,distancia;
		
		distancia=this.distanciaGeodesica((Coordenada)caseObject, (Coordenada)queryObject);
		if(distancia<1){
			valor=1;
		}else{
			valor=1/distancia;
		}
		
		return valor;
	}


	public boolean isApplicable(Object caseObject, Object queryObject) {

		return (caseObject instanceof Coordenada && queryObject instanceof Coordenada);
	}
	
	private double distanciaGeodesica(Coordenada cord1, Coordenada cord2){
		double latitud1,latitud2,longitud1,longitud2,distancia=0;
		double dlong,dvalue,dd;
		latitud1=cord1.getLatitud();
		latitud2=cord2.getLatitud();
		
		longitud1=cord1.getLongitud();
		longitud2=cord2.getLongitud();
		
		dlong=(longitud1-longitud2);
		dvalue=(Math.sin(Math.toRadians(latitud1))*Math.sin(Math.toRadians(latitud2)))
				+(Math.cos(Math.toRadians(latitud1))*Math.cos(Math.toRadians(latitud2))
						*Math.cos(Math.toRadians(dlong)));
		dd=Math.toDegrees(Math.acos(dvalue));
		
		distancia=(dd*111.302);
		
		return distancia;
	}

}
